#include "mainform.h"
#include "ui_mainform.h"
#include <sudoku.h>
#include <sudokucell.h>
#include <QDebug>
#include <QMessageBox>
#include <sudokuwidget.h>

MainForm::MainForm(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MainForm)
{
    ui->setupUi(this);

    // sudoku::Sudoku obj;
    // auto cells = obj.generatePuzzle(0);

    // for (const auto& nums : cells)
    // {
    //     qDebug() << nums;
    // }

    // auto toGridIndex = [] (int row, int col) -> int
    // {
    //     return (row / 3) * 3 + col / 3;
    // };

    // auto toCellIndex = [] (int row, int col) -> int
    // {
    //     return (row - row / 3 * 3) * 3 + col - col / 3 * 3;
    // };

    // for (auto i = 0; i < 3; i++)
    // {
    //     for (auto j = 0; j < 3; j++)
    //     {
    //         qDebug() << tr("(%1, %2)是第%3个九宫格的第%4个单元格")
    //                         .arg(i + 1)
    //                         .arg(j + 1)
    //                         .arg(toGridIndex(i, j) + 1)
    //                         .arg(toCellIndex(i, j) + 1);
    //     }
    // }

    // for (auto i = 0; i < 3; i++)
    // {
    //     for (auto j = 3; j < 6; j++)
    //     {
    //         qDebug() << tr("(%1, %2)是第%3个九宫格的第%4个单元格")
    //                         .arg(i + 1)
    //                         .arg(j + 1)
    //                         .arg(toGridIndex(i, j) + 1)
    //                         .arg(toCellIndex(i, j) + 1);
    //     }
    // }

    auto toRow = [] (int gridIndex, int cellIndex) ->int
    {
        return gridIndex / 3 * 3 + cellIndex / 3;
    };

    auto toCol = [] (int gridIndex, int cellIndex) ->int
    {
        return gridIndex % 3 * 3 + cellIndex % 3;
    };

    auto gridIndex = 5;
    for (auto i = 0; i < 9; i++)
    {
        qDebug() << tr("第%1个九宫格的第%2个单元格在数独中的位置(%3, %4)")
                        .arg(gridIndex)
                        .arg(i + 1)
                        .arg(toRow(gridIndex, i))
                        .arg(toCol(gridIndex, i));
    }

    connect(sudoku_ui::SudokuCellSignals::globalInstance(),
            &sudoku_ui::SudokuCellSignals::checkNum,
            this,
            &MainForm::onCheckGame);

    sudoku_ui::SudokuCell::globalInitColors();

    // ui->widget->setNumbers(cells);
}

MainForm::~MainForm()
{
    delete ui;
}

void MainForm::setNum(int n)
{
    if (m_flag)
        ui->widget->setSudokuHintValue(n);
    else
        ui->widget->setSudokuValue(n);
}

void MainForm::on_btn_1_clicked()
{
    setNum(1);
}


void MainForm::on_btn_2_clicked()
{
    setNum(2);
}

void MainForm::on_btn_3_clicked()
{
    setNum(3);
}


void MainForm::on_btn_4_clicked()
{
    setNum(4);
}


void MainForm::on_btn_5_clicked()
{
    setNum(5);
}


void MainForm::on_btn_6_clicked()
{
    setNum(6);
}


void MainForm::on_btn_7_clicked()
{
    setNum(7);
}


void MainForm::on_btn_8_clicked()
{
    setNum(8);
}


void MainForm::on_btn_9_clicked()
{
    setNum(9);
}


void MainForm::on_btn_flag_clicked()
{
    m_flag = !m_flag;
}


void MainForm::on_btn_newGame_clicked()
{
#if 1
    sudoku::Sudoku obj;
    auto cells = obj.generatePuzzle(1);
    // auto cells = obj.generateSolution();
    for (auto& row : cells)
        qDebug() << row;
    ui->widget->clear();
    ui->widget->setNumbers(cells);

    auto cells1 = ui->widget->getNumbers();
    for (auto& row : cells1)
        qDebug() << row;
#else
    sudoku_ui::SudokuWidget widget;
    widget.resize(800, 600);
    widget.show();
#endif
}

void MainForm::onCheckGame(int row, int col, int num)
{
    // auto cells = ui->widget->getNumbers();
    // for (const auto& nums : cells)
    //     qDebug() << nums;
    // qDebug() << num;
    // sudoku::Sudoku obj;
    // if (obj.isValid(cells, row, col, num))  // 该数字正确时处理
    // {
    //     qDebug() << tr("正确");
    //     if (ui->widget->isOk())     //所有单元格被填充完后
    //     {
    //         auto result = ui->widget->checkGame();
    //         if (result.empty())
    //         {
    //             QMessageBox::information(nullptr, tr("提示"), tr("游戏完成"));
    //             on_btn_newGame_clicked();
    //         }
    //     }
    // }
    // else
    //     qDebug() << tr("错误");
}

